/*
1、题目描述
找出元素 item 在给定数组 arr 中的位置
输出描述:
如果数组中存在 item，则返回元素在数组中的位置，否则返回 -1
示例1
输入
[ 1, 2, 3, 4 ], 3
输出
2

function indexOf(arr, item) {
return arr.indexOf(item)
}
*/
// function indexOf(arr,item){
//     for(var i=0;i<arr.length;i++){
//         if(arr[i]===item){
//             return arr.indexOf(item)
//         }
//         }
//     return -1;
//     }
/*
2、题目描述
计算给定数组 arr 中所有元素的总和
输入描述:
数组中的元素均为 Number 类型
示例1
输入

[ 1, 2, 3, 4 ]
输出

10

*/
function sum(arr) {
    var sum=0;
for(var i=0;i<arr.length;i++){
    sum=sum+arr[i];
}
return sum;
}
/*
3、题目描述
移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr，结果返回新的数组
示例1
输入

[1, 2, 3, 4, 2], 2
输出

[1, 3, 4]

*/
function remove(arr,item){
    var arr2=[];
    for(var i=0;i<arr.length;i++){
        if(arr[i]!==item){
            arr2.push(arr[i])
        }
    }
    return arr2;
}
// function remove(arr, item) {
//     var index=[];
//     var arr2=[];
//     for(let i=0;i<arr.length;i++){
//         if(arr[i]===item){
//             index.push(i);
//         }
//     }
//     arr2=arr.slice();
//     for(let i=0;i<index.length;i++){
//             arr2.splice(index[i],1);
//     }
//     return arr2;

// }

    // function remove(arr,item){
    //     var arr2=[];
    //     for(let i=0;i<arr.length;i++){
    //         if(arr[i]!==item){
    //             arr2.push(arr[i]);
    //         }
    //     }
    //     return arr2;
    // }


/*
4、题目描述
移除数组 arr 中的所有值与 item 相等的元素，直接在给定的 arr 数组上进行操作，并将结果返回
示例1
输入

[1, 2, 2, 3, 4, 2, 2], 2
输出

[1, 3, 4]

function removeWithoutCopy(arr, item) {
    for(let i=0;i<arr.length;i++){
        if(arr[i]===item){
            arr.splice(i,1)
            i--;
        }
    }
    return arr;
}
*/
// function removeWithoutCopy(arr, item) {
//     for(let i=0;i<arr.length;i++){
//         if(arr[i]===item){
//             arr.splice(i,1);
//             i--;''
//         }
//     }
//     return arr;
// }
/*
5、题目描述
在数组 arr 末尾添加元素 item。不要直接修改数组 arr，结果返回新的数组
示例1
输入

[1, 2, 3, 4],  10
输出

[1, 2, 3, 4, 10]

function append(arr, item) {
 var arr2=arr.slice();
 arr2.push(item);
 return arr2;
}
*/
// function append(arr,item){
//     var arr2=[];
//     arr2=arr.slice();
//     arr2.push(item);
//     return arr2;
// }
/*
6、题目描述
删除数组 arr 最后一个元素。不要直接修改数组 arr，结果返回新的数组
示例1
输入

[1, 2, 3, 4]
输出

[1, 2, 3]

function truncate(arr) {
    var arr2=arr.slice();
    arr2.splice(arr2.length-1,1);
    return arr2;
}
*/
// function truncate(arr) {
//     var arr2=arr.slice();
//     arr2.splice(arr.length-1,1);
//     return arr2;
// }
/*
7、题目描述
在数组 arr 开头添加元素 item。不要直接修改数组 arr，结果返回新的数组
示例1
输入

[1, 2, 3, 4], 10
输出

[10, 1, 2, 3, 4]

function prepend(arr, item) {
    var arr2=arr.slice();
    arr2.unshift(item);
    return arr2;
}
*/
// function prepend(arr, item) {
//     var arr2=arr.slice();
//     arr2.unshift(item);
//     return arr2;
// }
/*
8、题目描述
删除数组 arr 第一个元素。不要直接修改数组 arr，结果返回新的数组
示例1
输入

[1, 2, 3, 4]
输出

[2, 3, 4]

function curtail(arr) {

}
*/
// function curtail(arr) {
//     var arr2=arr.slice();
//     arr2.shift();
//     return arr2;
// }
/*
9、题目描述
合并数组 arr1 和数组 arr2。不要直接修改数组 arr，结果返回新的数组
示例1
输入

[1, 2, 3, 4], ['a', 'b', 'c', 1]
输出

[1, 2, 3, 4, 'a', 'b', 'c', 1]

function concat(arr1, arr2) {
    var arr3=arr1.concat(arr2)
    return arr3;
}
*/
// function concat(arr1, arr2) {
//     var arr3=arr1.concat(arr2);
//     return arr3;
// }
/*
10、题目描述
在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr，结果返回新的数组
示例1
输入

[1, 2, 3, 4], 'z', 2
输出

[1, 2, 'z', 3, 4]

function insert(arr, item, index) {
    var arr2=arr.slice();
    arr2.splice(index,0,item);
    return arr2;
}
*/
// function insert(arr, item, index) {
//     var arr2=arr.slice();
//     arr2.splice(index,0,item);
//     return arr2;
// }
/*
11、题目描述
统计数组 arr 中值等于 item 的元素出现的次数
示例1
输入

[1, 2, 4, 4, 3, 4, 3], 4
输出

3

function count(arr, item) {
    var count=0;
    for(var i=0;i<arr.length;i++){
        if(arr[i]===item){
            count++;
        }
    }
    return count
}
*/
// function count(arr, item) {
//     let count=0;
//     for(let i=0;i<arr.length;i++){
//         if(arr[i]===item){
//             count++;
//         }
//     }
//     return count;
// }
/*
12、题目描述
找出数组 arr 中重复出现过的元素
示例1
输入

[1, 2, 4, 4, 3, 3, 1, 5, 3]
输出

[1, 3, 4]

function duplicates(arr) {

}
*/
// function duplicates(arr) {
//     let arr2=[];
//     for(let i=0;i<arr.length;i++){
//         if(arr.indexOf(arr[i])!=i){
//             arr2.push(arr[i])
//         }
//     }

//     for(let i=0;i<arr2.length;i++){
//         if(arr2.indexOf(arr2[i])!=i){
//             arr2.splice(i,1);
//         }
//     }
//     arr2.sort();
//     return arr2;
// }
/*
13、题目描述
为数组 arr 中的每个元素求二次方。不要直接修改数组 arr，结果返回新的数组
示例1
输入

[1, 2, 3, 4]
输出

[1, 4, 9, 16]

function square(arr) {
var arr2=arr.slice();
arr2.map(function(x){
    return x*x;
})
return arr2;
}
*/
// function square(arr) {
// var arr2=arr.map(function(x){
//     return x*x;
// })
// return arr2;
// }
/*
14、题目描述
在数组 arr 中，查找值与 item 相等的元素出现的所有位置
示例1
输入

['a','b','c','d','e','f','a','b','c'] 'a'
输出

[0, 6]

function findAllOccurrences(arr, target) {
    var arr2=[];
    for(var i=0;i<arr.length;i++){
        if(arr[i]===target){
            arr2.push(i);
        }
    }
    return arr2;
}
*/
// function findAllOccurrences(arr, target) {
// var arr2=[];
// for(let i=0;i<arr.length;i++){
//     if(arr[i]===target){
//         arr2.push(i);
//     }
// }
// return arr2;
// }
/*
15、题目描述
判断 val1 和 val2 是否完全等同

function identity(val1, val2) {
    if(val1==val2){
        return '完全等同'
    }else{
        return '不完全等同'
    }
}

*/
// function identity(val1, val2) {
//     if(val1==val2){
//         return '完全等同';
//     }else
//     {
//         return '不完全等同';
//     }
// }
/*
16、题目描述
定义一个计算圆面积的函数area_of_circle()，它有两个参数：

r: 表示圆的半径；
pi: 表示π的值，如果不传，则默认3.14

function area_of_circle(r, pi=3.14) {
return r*r*pi
}
*/
// function area_of_circle(r, pi) {
//     if(typeof(pi)==='undefined'){
//         pi=3.14;
//     }
//     return r*r*pi;
// }
/*
17、题目描述

<!-- HTML结构 -->
<ul id="test-list">
    <li>JavaScript</li>
    <li>Swift</li>
    <li>HTML</li>
    <li>ANSI C</li>
    <li>CSS</li>
    <li>DirectX</li>
</ul>

针对以上文档结构，请把与Web开发技术不相关的节点删掉：

注意！！请分别使用原生JS和jQuery两种试实现！！！！！

*/
// var a=document.getElementById('test-list');
// a.removeChild(a.children[1])
// a.removeChild(a.children[2]);
// a.removeChild(a.children[3]);


// var a=$('#test-list')
// var b=$('#test-list li')
// var c=b.slice(1,2)
// var d=b.slice(3,4);
// var e=b.slice(5,6)
// c.remove();
// d.remove();
// e.remove();
// var c=b.filter(function(){
//     return this.innerHTML.indexOf('Swift')===0;
// });
// var d=b.filter(function(){
//     return this.innerHTML.indexOf('ANSI')===0;
// });
// var e=b.filter(function(){
//     return this.innerHTML.indexOf('DirectX')===0;
// })
// c.remove();
// d.remove();
// e.remove();
// console.log(a)
// console.log(b)
// console.log(c);






















// 练习 定义一个计算圆面积的函数area_of_circle()，它有两个参数：

// r: 表示圆的半径； pi: 表示π的值，如果不传，则默认3.14

// // 'use strict';

// function area_of_circle(r, pi) {
//     if(typeof(pi)==='undefined'){
//         pi=3.14
//     }
//     return r*pi;
// }
// //or
// function area_of_circle(r, pi=3.14) {
//     return r*pi;
// }
// // 测试:
// // if (area_of_circle(2) === 12.56 && area_of_circle(2, 3.1416) === 12.5664) {
// //     console.log('测试通过');
// // } else {
// //     console.log('测试失败');
// // }
// // 小明是一个JavaScript新手，他写了一个max()函数，返回两个数中较大的那个：

// 'use strict';

// function max(a, b) {

//     if (a > b) {
//         return a;
//     } else {
//         return b;
//     }

// }
// console.log(max(15, 20));
// // 但是小明抱怨他的浏览器出问题了，无论传入什么数，max()函数总是返回undefined。请帮他指出问题并修复。
// //因为js分行时 会在行末自动加;导致了返回空值，可以使用{}表示语句未结束;或者写在同一行
// //undefined 一般情况
// // 1、变量声明且没有赋值；

// // 2、获取对象中不存在的属性时；

// // 3、函数需要实参，但是调用时没有传值，形参是undefined；

// // 4、函数调用没有返回值或者return后没有数据，接收函数返回的变量是undefined。

// function datetime({year,month,day,hours,minutes,seconds}){
//     var date=new Date(year,month,day,hours,minutes,seconds)
//     if(seconds===0){
//         return date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDay()+' '+date.getHours()+':'+date.getMinutes()+':'+'00';
//     }
//     return date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDay()+' '+date.getHours()+':'+date.getMinutes()+':'+date.getSeconds();
// }
// console.log(datetime({year:2021,month:11,day:7,hours:22,minutes:17,seconds:14}))

// function getAge() {
//     var y = new Date().getFullYear();
//     return y - this.birth;
// }

// console.log(this)//指向windwos
// 'use strict'

// var xiaoming = {
//     name: '小明',
//     birth: 1990,
//     age: function () {
//         var y = new Date().getFullYear();
//         return y - this.birth;
//     }
// };
// var fn=xiaoming.age();
// console.log(fn);//31
// var fn2=xiaoming.age;
// fn2();//error 严格模式下error 不严格无反应
// function add(x,y,f){
//     return f(x)+f(y);
// }
// function product(x){
//     return x*x;
// }

// console.log(add(1,2,product))
// 'use strict'
// function product(x){
//     return x*x;
// }
// var arr=[1,2,3,4,5,6,7];
// console.log(arr.map(product));
// console.log(arr.map(String));
// var arr='13579';
// function demo(x){
//     var arr2=[];
//     for(let i=0;i<x.length;i++){
//         arr2[i]=x[i];
//     }
//     return arr2.reduce(function(x,y){
//         return (+x)*10+(+y)
//     })
// }
// console.log(demo(arr));



// 'use strict';

// var arr = ['1', '2', '3'];
// var r;
// r = arr.map(function(x){
//     return parseInt(x,0)
// });

// console.log(r);
//练习 请把用户输入的不规范的英文名字，变为首字母大写，其他小写的规范名字。输入：['adam', 'LISA', 'barT']，输出：['Adam', 'Lisa', 'Bart']。

// var arr='LISA';
// var first='';
// var last='';
// for(let i=0;i<arr.length;i++){
//     if(i===0){
//         first=arr.slice(0,1).toUpperCase()
//     }else{
//         last=last+arr.slice(i,i+1).toLowerCase();
//     }
// }
// arr=first+last;
// console.log(arr)

// 'use strict';

// function get_primes(arr) {
//     return arr.filter(function(x){
//         let isture=true;
//         if(x===1){
//             return false;
//         }
//         for(let i=2;i<x;i++){
//             if(x%i===0){
//                 isture=false;
//                 return isture;
//             }
//         }
//         return isture;
//     });

// }

// // 测试:
// var
//     x,
//     r,
//     arr = [];
// for (x = 1; x < 100; x++) {
//     arr.push(x);
// }
// r = get_primes(arr);
// if (r.toString() === [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97].toString()) {
//     console.log('测试通过!');
// } else {
//     console.log('测试失败: ' + r.toString());
// }


// for(var i=1;i<=5;i++){
//     setTimeout(function(){
//         console.log(i);
//     },1000);
// }
// for(var i=1;i<=5;i++){
//     (function(i){
//         setTimeout(function timer(){
//             console.log(i);
//         },1000);
//     })(i);
// }

// function fun(n,o){
//     console.log(o);
//     return{
//         fun:function(m){
//             return fun(m,n);
//         }
//     };
// }
// var a=fun(0);a.fun(1);a.fun(2);a.fun(3);//单次调用 un 0 0 0
// var b=fun(0).fun(1).fun(2).fun(3);//连续 un 0 1 2
// var c=fun(0).fun(1);c.fun(2);c.fun(3);// un 0 1 1



// //练习 小明为了和女友庆祝情人节，特意制作了网页，并提前预定了法式餐厅。小明打算用JavaScript给女友一个惊喜留言：

// 'use strict';
// var today = new Date();
// if (today.getMonth() === 1 && today.getDate() === 19) {
//     alert('亲爱的，我预定了晚餐，晚上6点在餐厅见！');
// }//月份从0开始 为1月


// 练习 请使用箭头函数简化排序时传入的函数：

// 'use strict'
// var arr = [10, 20, 1, 2];
// arr.sort((x, y) => {
//     return x-y;
// });
// console.log(arr); // [1, 2, 10, 20]
// 'use strict'
// var arr = [10, 20, 1, 2];
// arr.sort((x, y) => x-y);
// console.log(arr); // [1, 2, 10, 20]

// ^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$


// 'use strict';
// var re = /^[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)?@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;

// // 测试:
// var
//     i,
//     success = true,
//     should_pass = ['someone@gmail.com', 'bill.gates@microsoft.com', 'tom@voyager.org', 'bob2015@163.com'],
//     should_fail = ['test#gmail.com', 'bill@microsoft', 'bill%gates@ms.com', '@voyager.org'];
// for (i = 0; i < should_pass.length; i++) {
//     if (!re.test(should_pass[i])) {
//         console.log('测试失败: ' + should_pass[i]);
//         success = false;
//         break;
//     }
// }
// for (i = 0; i < should_fail.length; i++) {
//     if (re.test(should_fail[i])) {
//         console.log('测试失败: ' + should_fail[i]);
//         success = false;
//         break;
//     }
// }
// if (success) {
//     console.log('测试通过!');
// }



// 'use strict';

// class Animal {
//     constructor(name) {
//         this.name = name;
//     }
// }
// class Cat extends Animal{
//     constructor(name){
//         super(name);
        
//     }
//     say() {
//         return `Hello, ${this.name}!`;
//     }
// }

// // 测试:
// var kitty = new Cat('Kitty');
// var doraemon = new Cat('哆啦A梦');
// if ((new Cat('x') instanceof Animal)
//     && kitty 
//     && kitty.name === 'Kitty'
//     && kitty.say
//     && typeof kitty.say === 'function'
//     && kitty.say() === 'Hello, Kitty!'
//     && kitty.say === doraemon.say)
// {
//     console.log('测试通过!');
// } else {
//     console.log('测试失败!');



// 'use strict';
// // 可以调整浏览器窗口大小试试:
// console.log('window inner size: ' + window.innerWidth + ' x ' + window.innerHeight);



// 'use strict';
// console.log('appName = ' + navigator.appName);
// console.log('appVersion = ' + navigator.appVersion);
// console.log('language = ' + navigator.language);
// console.log('platform = ' + navigator.platform);
// console.log('userAgent = ' + navigator.userAgent);


// 'use strict'
// var width = window.innerWidth || document.body.clientWidth;
// console.log(width);

// function Student(name) {
//     this.name = name;
// }

// Student.prototype.hello = function () {
//     alert('Hello, ' + this.name + '!');
// };

// var xiaoming= new Student('小明')
// xiaoming.hello();


// if (confirm('重新加载当前页' + location.href + '?')) {
//     location.reload();
// } else {
//     location.assign('/'); // 设置一个新的URL地址
// }
// 'use strict';
// document.title = '努力学习JavaScript!';

// var menu = document.getElementById('drink-menu');
// var drinks = document.getElementsByTagName('dt');
// console.log(menu)
// console.log(drinks[0].innerHTML)



// 'use strict';
// var menu = document.getElementById('drink-menu');
// var drinks = document.getElementsByTagName('dt');
// var i, s;

// s = '提供的饮料有:';
// for (i=0; i<drinks.length; i++) {
//     s = s + drinks[i].innerHTML + ',';
// }
// console.log(s);



// 'use strict';
// // 获取<p>javascript</p>节点:
// var js = document.getElementById('test-js');

// // 修改文本为JavaScript:
// // TODO:
// js.innerText='JavaScript';

// // 修改CSS为: color: #ff0000, font-weight: bold
// // TODO:
// js.style.color='#ff0000';
// js.style.fontWeight='bold';
// // 测试:
// if (js && js.parentNode && js.parentNode.id === 'test-div' && js.id === 'test-js') {
//     if (js.innerText === 'JavaScript') {
//         if (js.style && js.style.fontWeight === 'bold' && (js.style.color === 'red' || js.style.color === '#ff0000' || js.style.color === '#f00' || js.style.color === 'rgb(255, 0, 0)')) {
//             console.log('测试通过!');
//         } else {
//             console.log('CSS样式测试失败!');
//         }
//     } else {
//         console.log('文本测试失败!');
//     }
// } else {
//     console.log('节点测试失败!');

// var d = document.createElement('style');//创建对象
// d.setAttribute('type', 'text/css');//设置属性
// d.innerHTML = 'p { color: red }';//css格式内容
// document.getElementsByTagName('head')[0].appendChild(d);//document.getElementsByTagName('head')是一个集合加上[0]就是<head>签内
// console.log(document.getElementsByTagName('head')[0])

// 'use strict';
// // sort list:

// // 测试:
// ;(function () {
//     var
//         arr=[], i,
//         t = document.getElementById('test-list');
//         for(i=0;i<t.children.length;i++){
//             arr.push(t.children[i].innerText)
//         }
//         arr.sort();
//         console.log(arr)
//         for(i=0;i<t.children.length;i++){
//             t.children[i].innerText=arr[i];
//         }
//     if (t && t.children && t.children.length === 5) {
//         arr = [];
//         for (i=0; i<t.children.length; i++) {
//             arr.push(t.children[i].innerText);
//         }
//         if (arr.toString() === ['Haskell', 'JavaScript', 'Python', 'Ruby', 'Scheme'].toString()) {
//             console.log('测试通过!');
//         }
//         else {
//             console.log('测试失败: ' + arr.toString());
//         }
//     }
//     else {
//         console.log('测试失败!');
//     }
// })();

// 'use strict';
// TODO

// 测试:
{/* <li>JavaScript</li>
<li>Swift</li>
<li>HTML</li>
<li>ANSI C</li>
<li>CSS</li>
<li>DirectX</li> */}
// ;(function () {
//     var
//         arr, i,
//         t = document.getElementById('test-list');
//         arr
//         for(i=0;i<t.children.length;i++){
//             if(t.children[i].innerText==='Swift'||'ANSI'||'DirectX'){
//                 t.removeChild(t.children[i])
//             }
//         }

//     if (t && t.children && t.children.length === 3) {
//         arr = [];
//         for (i = 0; i < t.children.length; i ++) {
//             arr.push(t.children[i].innerText);
//         }
//         if (arr.toString() === ['JavaScript', 'HTML', 'CSS'].toString()) {
//             console.log('测试通过!');
//         }
//         else {
//             console.log('测试失败: ' + arr.toString());
//         }
//     }
//     else {
//         console.log('测试失败!');
//     }
// })();



// 'use strict';

// // 清除log:
// var logging = document.getElementById('test-promise-log');
// while (logging.children.length > 1) {
//     logging.removeChild(logging.children[logging.children.length - 1]);
// }

// // 输出log到页面:
// function log(s) {
//     var p = document.createElement('p');
//     p.innerHTML = s;
//     logging.appendChild(p);
// }


// new Promise(function (resolve, reject) {
//     log('start new Promise...');
//     var timeOut = Math.random() * 2;
//     log('set timeout to: ' + timeOut + ' seconds.');
//     setTimeout(function () {
//         if (timeOut < 1) {
//             log('call resolve()...');
//             resolve('200 OK');
//         }
//         else {
//             log('call reject()...');
//             reject('timeout in ' + timeOut + ' seconds.');
//         }
//     }, timeOut * 1000);
// }).then(function (r) {
//     log('Done: ' + r);
// }).catch(function (reason) {
//     log('Failed: ' + reason);
// });
// 'use strict';

// var logging = document.getElementById('test-promise2-log');
// while (logging.children.length > 1) {
//     logging.removeChild(logging.children[logging.children.length - 1]);
// }//同步删除
// //直接删除 剩下一个children

// function log(s) {
//     var p = document.createElement('p');
//     p.innerHTML = s;
//     logging.appendChild(p);
// }//同步添加方法
// // 0.5秒后返回input*input的计算结果:
// function multiply(input) {
//     return new Promise(function (resolve, reject) {
//         log('calculating ' + input + ' x ' + input + '...');
//         setTimeout(resolve, 500, input * input);
//     });
// }//异步

// // 0.5秒后返回input+input的计算结果:
// function add(input) {
//     return new Promise(function (resolve, reject) {
//         log('calculating ' + input + ' + ' + input + '...');
//         setTimeout(resolve, 500, input + input);
//     });
// }//异步

// var p = new Promise(function (resolve, reject) {
//     log('start new Promise...');//添加一个children
//     resolve(123);//.then 传输123
// });

// p.then(multiply)//返回123*123
//  .then(add)//返回123+123
//  .then(multiply)
//  .then(add)
//  .then(function (result) {
//     log('Got value: ' + result);
// });

// function callback() {
//     console.log('Done');
// }
// console.log('before setTimeout()');
// setTimeout(callback, 1000); // 1秒钟后调用callback函数
// console.log('after setTimeout()');

    // 'use strict';

    // var selected = null;
    // selected =$('p#para-1') ;
    // selected=$('p.color-red.color-green')
    // selected=$('p.color-red')
    // selected=$("p[name='name']")
    // selected=$('p#para-1,p#para-2,p.color-red.color-green,p[name="name"]')
    // selected=$('input[name="name"]')
    // selected=$('input[name="name"],input[name="email"]');
    // // 高亮结果:
    // if (!(selected instanceof jQuery)) {
    //      console.log('不是有效的jQuery对象!');
    // }
    // $('#test-jquery').find('*').css('background-color', '');
    // selected.css('background-color', '#ffd351');


//     'use strict';
// var selected = null;
// // 分别选择所有语言，所有动态语言，所有静态语言，JavaScript，Lua，C等:
// selected =$('ul li,ol li')
// //or
// selected=$('li')
// selected=$('li.lang-swift,li.lang-python,li.lang-java')
// selected=$('li.lang-javascript,li.lang-lua,li.lang-c')
// // 高亮结果:
// if(!(selected instanceof jQuery)) {
//      console.log('不是有效的jQuery对象!');
// }
// $('#test-jquery').find('*').css('background-color', '');
// selected.css('background-color', '#ffd351');

// 输入值后，用jQuery获取表单的JSON字符串，key和value分别对应每个输入的name和相应的value，例如：{"name":"Michael","email":...}

// 'use strict';
// var json = null;
// json =

// // 显示结果:
// if (typeof(json) === 'string') {
//     console.log(json);
// }
// else {
//     console.log('json变量不是string!');
// }
// 'use strict';
// var a=$('form :button')
// a.on('click',function(){
//     var json = null;
//     var obj={};
//     var form=$('#test-form :input')
//     var ff=form.filter(function(){
//         if(this.type==='radio'&&!this.checked||this.type==='submit'){
//             return false;
//         }else{
//             return true;
//         }
//     })
//     ff.map(function(){
//         console.log(this.name)
//         return obj[this.name]=this.value;
//     })
//     json=JSON.stringify(obj,null,' ');
//     // 显示结果:
// if (typeof(json) === 'string') {
//     console.log(json);
// }
// else {
//     console.log('json变量不是string!');
// }
// })

// var form=$('#test-form :input')
// console.log(form['name'])



// 'use strict';
// var div = $('#test-highlight-css');
// var children=div.find('.js')
// children.addClass('highlight')
// children.removeClass('highlight')
// children.css('color','#dd1144').css('background-color','#ffd351')


// 要求:
// 绑定合适的事件处理函数，实现以下逻辑：

// 当用户勾上“全选”时，自动选中所有语言，并把“全选”变成“全不选”；

// 当用户去掉“全不选”时，自动不选中所有语言；

// 当用户点击“反选”时，自动把所有语言状态反转（选中的变为未选，未选的变为选中）；

// 当用户把所有语言都手动勾上时，“全选”被自动勾上，并变为“全不选”；

// 当用户手动去掉选中至少一种语言时，“全不选”自动被去掉选中，并变为“全选”。

var
    form = $('#test-form'),
    langs = form.find('[name=lang]'),
    selectAll = form.find('label.selectAll :checkbox'),
    selectAllLabel = form.find('label.selectAll span.selectAll'),
    deselectAllLabel = form.find('label.selectAll span.deselectAll'),
    invertSelect = form.find('a.invertSelect');

form.find('*').show().off();
form.find(':checkbox').prop('checked', false).off();
deselectAllLabel.hide();

form.off().submit(function (e) {
    e.preventDefault();
    alert(form.serialize());
});

selectAll.on('click',function(){
    if(selectAll.prop('checked')){
        langs.prop('checked',true)
        selectAllLabel.hide();
        deselectAllLabel.show();
    }else{
        langs.prop('checked',false)
        selectAllLabel.show();
        deselectAllLabel.hide();
    }

})

invertSelect.on('click',function(){
    let lang=$('[name=lang]:checked');
    langs.prop('checked',true);
    lang.prop('checked',false);

    if(lang.length===0){
        selectAll.prop('checked',true)
        selectAllLabel.hide();
        deselectAllLabel.show();
    }
    if(lang.length===5){
        selectAll.prop('checked',false);
        selectAllLabel.show();
        deselectAllLabel.hide();
    }
    
})

langs.on('click',function(){
    let lang=$('[name=lang]:checked');
    if(lang.length===5){
        selectAll.prop('checked',true)
        selectAllLabel.hide();
        deselectAllLabel.show();
    }
    if(lang.length<5){
        selectAll.prop('checked',false);
        selectAllLabel.show();
        deselectAllLabel.hide();
    }
})






